package com.tp.server;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * Administrador de registros de cache.
 * 
 * @author Franke Oviedo Triay
 * 
 *
 */
public class DomainCache {

	private Map<String, CacheRegistry> domainCache;
	
	/**
	 * Constructor.
	 */
	public DomainCache(){
		this.setDomainCache(new LinkedHashMap<String, CacheRegistry>()); 
	}

	/**
	 * Agrega al cache una entrada recientemente buscada. Metodo sincronizado
	 * para controlar la escritura concurrente de los hilos clientes.
	 * 
	 * @param domain dominio buscado.
	 * @param ip ip asociada al dominio buscado.
	 */
	public synchronized void addDomain(String domain, String ip){
		//si el dominio no se encuentra en cache es agregado
		if(domainCache.get(domain) == null){
			domainCache.put(domain, new CacheRegistry(ip));
		}		
	}
	
	/**
	 * Elimina un dominio del cache.
	 * 
	 * @param domain Dominio que se eliminara del cache.
	 */
	private void deleteDomain(String domain){
		domainCache.remove(domain);
	}
	
	
	/**
	 * Obtiene la ip de un dominio en cache a partir del nombre del mismo.
	 * @param domain Dominio que se buscara en cache.
	 * @return String Ip del dominio, en caso de no encontrar el dominio
	 * o si este es antiguo retorna null.
	 */
	public String getDomainByKey(String domain){

		CacheRegistry reg = domainCache.get(domain);
		
		if(reg != null){
			if(reg.isUpToDate()){
				reg.updateTime();
				return reg.getIp();
			}else{
				//si el dominio es encontrado pero es antiguo se borra y retorna null,
				//comunicando que el dominio no esta en cache.
				deleteDomain(domain);
			}
		}
		
		return null;
	}
	
	/**
	 * Retorna el mapa de los dominios en cache.
	 * 
	 * @return Map<String, CacheRegistry> mapa de dominios en cache.
	 */
	public Map<String, CacheRegistry> getDomainCache() {
		return domainCache;
	}


	public void setDomainCache(Map<String, CacheRegistry> domainCache) {
		this.domainCache = domainCache;
	}
	
	
	
}
